package pc

import (
	. "chess_platform/internal/common"
	"chess_platform/models/pc"
	"time"
)

//[pc]stat:数据统计
type StatController struct {
	GrantController
}

func (b *StatController) URLMapping() {
	//user-stat:用户统计
	b.Mapping("ListUserStat", b.ListUserStat)

	//user-graph:用户统计
	b.Mapping("ListUserGraph", b.ListUserGraph)

	//chess:牌局统计
	b.Mapping("ListChess", b.ListChess)
	b.Mapping("ListChessDetail", b.ListChessDetail)
	b.Mapping("ListGameTrans", b.ListGameTrans)
	b.Mapping("ListGame", b.ListGame)

	//day-agent:代理日报表
	b.Mapping("ListDayAgent", b.ListDayAgent)

	//month-agent:代理月报表
	b.Mapping("ListMonthAgent", b.ListMonthAgent)

	//club:亲友圈报表
	b.Mapping("ListClubStat", b.ListClubStat)
	b.Mapping("ListClubGame", b.ListClubGame)

	//day-system
	b.Mapping("ListDaySystemUser", b.ListDaySystemUser)
	//month-system
	b.Mapping("ListMonthSystemUser", b.ListMonthSystemUser)
	//system-user-detail:
	b.Mapping("ListSystemUserDetail", b.ListSystemUserDetail)
	//system-user
	b.Mapping("ListSystemUser", b.ListSystemUser)

}

// @Title 用户统计(玩家统计,日活,留存率之类的)
// @Description  用户统计(玩家统计,日活,留存率之类的)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   day    		 body   int     true       "哪一天的时间戳"
// @Param   order_name 	 body   string  false      "排序名字,dau,mau,day_register,total_register,two_day,three_day,seven_day"
// @Param   order        body   int     false      "1-升序,2-降序"
// @Success 0 {object} [] 用户统计(玩家统计)
// @router /user-stat/list-user-stat [post]
func (b *StatController) ListUserStat() {
	type Params struct {
		ListParams
		OrderParams
		Day int64 `json:"day"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}

	data, count, err := pc.ListDayUserStat(p.ListParams, p.OrderParams, p.Day)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 用户统计(日活,日注册拆线图)
// @Description  用户统计(日活,日注册拆线图)
// @Param   start_time    body   int     true       "开始时间"
// @Param   end_time      body   int     true       "结束时间"
// @Success 0 {object} [] 用户统计(玩家统计)
// @router /user-graph/list-user-graph [post]
func (b *StatController) ListUserGraph() {
	var p ListDayParams
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if p.EndTime < p.StartTime {
		b.ResponseFail("结束时间不能小于开始时间")
		return
	}
	if p.StartTime == 0 && p.EndTime == 0 {
		now := time.Now().Unix()
		p.EndTime = now
		p.StartTime = now - 30*86400 //查30天的数据
	}
	data, err := pc.ListUserGraph(p)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.ResponseSuccess()
}

// @Title 牌局统计(小局,桌子)
// @Description  牌局统计(小局,桌子)
// @Param   start_time    body   int     true       "开始时间(时间单位为天,时间戳)"
// @Param   end_time      body   int     true       "结束时间(时间单位为天,时间戳)"
// @Success 0 {object} [] 牌局统计(大局,小局,桌子)
// @router /chess/list-chess [post]
func (b *StatController) ListChess() {
	var p ListDayParams
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if (p.EndTime - p.StartTime) > 100*86400 {
		b.ResponseFail("最多只能查询100天数据")
		return
	}
	if p.StartTime == 0 && p.EndTime == 0 { //如果没传时间就查询前30天的数据
		now := time.Now().Unix()
		p.EndTime = now
		p.StartTime = now - 30*86400
	}

	b.Res.Data = pc.ListDayChess(p)
	b.ResponseSuccess()
}

// @Title 牌局统计(小局,桌子)
// @Description  牌局统计(小局,桌子)
// @Param   day    body   int     true       "某天的时间戳,只要是当天内任意时间"
// @Success 0 {object} [] 牌局统计(小局,桌子)
// @router /chess/list-chess-detail [post]
func (b *StatController) ListChessDetail() {
	type Params struct {
		Day int64 `json:"day" valid:"Required"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if !IsToday(p.Day) {
		data, err := pc.ListDayChessDetail(p.Day)
		if err != nil {
			LogPc.Error(b.DatabaseError(err.Error()))
			return
		}
		b.Res.Data = data
	} else {
		data, err := pc.ListTodayChessDetail(p.Day)
		if err != nil {
			LogPc.Error(b.DatabaseError(err.Error()))
			return
		}
		b.Res.Data = data
	}
	b.ResponseSuccess()
}

// @Title 牌局统计(小局,桌子,消耗的钻石数)
// @Description  牌局统计(小局,桌子,消耗的钻石数)
// @Param   start_time    body   int     false       "开始时间(时间单位为天,时间戳)"
// @Param   end_time      body   int     false       "结束时间(时间单位为天,时间戳)"
// @Param   game_id       body   int     false       "查找某一款游戏的情况"
// @Success 0 {object} [] 牌局统计(小局,桌子)
// @router /chess/list-game-trans [post]
func (b *StatController) ListGameTrans() {
	type Params struct {
		ListDayParams
		GameId int64 `json:"game_id"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	data, err := pc.ListGameTrans(p.ListDayParams, p.GameId, b.Ui.GroupId)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
	}
	b.Res.Data = data
	b.ResponseSuccess()
}

// @Title 游戏列表(游戏发布)
// @Description 游戏列表(游戏发布)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Success 0 {object} []common.GameList 游戏列表
// @router /chess/list-game [post]
func (b *StatController) ListGame() {
	var p ListParams
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	data, count, err := pc.ListGameByGroupId(p, b.Ui.GroupId)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取代理每日钻石列表
// @Description  获取代理每日钻石列表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   day          body   int     true       "查询哪一天(时间戳)的数据"
// @Param   type         body   int     true       "0-大区,1-一级代理,2-二级代理,3-全部代理"
// @Param   uid          body   int     false      "代理uid或大区id"
// @Param   order_name 	 body   string  false      "排序名字"
// @Param   order        body   int     false      "1-升序,2-降序"
// @Success 0 {object} []
// @router /day-agent/list-day-agent [post]
func (b *StatController) ListDayAgent() {
	type Params struct {
		Day  int64 `json:"day"`
		Type int64 `json:"type" valid:"Range(0,3)"`
		Uid  int64 `json:"uid"`
		OrderParams
		ListParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}

	agentInfo, count, err := pc.ListDayAgentInfo(p.ListParams, p.OrderParams, b.Ui.GroupId, p.Day, p.Type, p.Uid)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))

		return
	}

	b.Res.Data = agentInfo
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取代理每月钻石情况列表
// @Description  获取代理每月钻石情况列表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   month        body   int     true       "查询哪一个月(只要是这个月的时间戳就行)的数据"
// @Param   type         body   int     true       "0-大区,1-一级代理,2-二级代理,3-全部代理"
// @Param   uid          body   int     false      "代理uid或大区id"
// @Param   order_name 	 body   string  false      "排序名字"
// @Param   order        body   int     false      "1-升序,2-降序"
// @Success 0 {object} []
// @router /month-agent/list-month-agent [post]
func (b *StatController) ListMonthAgent() {
	type Params struct {
		Month int64 `json:"month"`
		Type  int64 `json:"type" valid:"Range(0,3)"`
		Uid   int64 `json:"uid"`
		ListParams
		OrderParams
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}

	agentInfo, count, err := pc.ListMonthAgentInfo(p.ListParams, p.OrderParams, b.Ui.GroupId, p.Month, p.Type, p.Uid)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}

	b.Res.Data = agentInfo
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 亲友圈统计(历史数据,过去的每一天)
// @Description  亲友圈统计(历史数据,过去的每一天)
// @Param   start_time    body   int     true       "开始时间"
// @Param   end_time      body   int     true       "结束时间"
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   club_id  	 body   int     false      "id(这个要废弃)"
// @Param   password     body   int     false      "亲友圈id(亲友圈密码)"
// @Param   game_id  	 body   int     false      "游戏id"
// @Param   host_id  	 body   int     false      "创建人id"
// @Param   status  	 body   int     false      "状态"
// @Success 0 {object} [] 亲友圈统计(历史数据,过去的每一天)
// @router /club/list-club-stat [post]
func (b *StatController) ListClubStat() {
	type Params struct {
		ListParams
		ListDayParams
		ClubId   int64 `json:"club_id"`
		Password int64 `json:"password"`
		HostId   int64 `json:"host_id"`
		GameId   int64 `json:"game_id"`
		Status   int64 `json:"status"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	data, count, err := pc.ListDayClubStat(p.ListParams, p.ListDayParams, p.ClubId, p.GameId, p.HostId, p.Status, p.Password)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 游戏列表(亲友圈列表统计)
// @Description 游戏列表(亲友圈列表统计)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Success 0 {object} []common.GameList 游戏列表
// @router /club/list-game [post]
func (b *StatController) ListClubGame() {
	var p ListParams
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	data, count, err := pc.ListGame(p, 0)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取系统帐号流水日报表
// @Description 获取系统帐号流水日报表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   start_time   body   int     false      "开始时间(时间单位为天,时间戳)"
// @Param   end_time     body   int     false      "结束时间(时间单位为天,时间戳)"
// @Param   operate_type body   int     false      "1-手动增加流入,2-购买流出,3-绑定手机赠送流出,4-活动赠送流出,5-手动赠送流出(后台增加玩家的钻石),6-手动回收流入(后台减少玩家的钻石), 7-玩家注册赠送流出,8-购买赠送流出"
// @Param   sys_uid      body   int     false      "系统帐号uid"
// @Success 0 {object} []
// @router /day-system/list-day-system [post]
func (b *StatController) ListDaySystemUser() {
	type Params struct {
		ListParams
		ListDayParams
		OperateType int64 `json:"operate_type"`
		SysUid      int64 `json:"sys_uid"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if p.StartTime == 0 && p.EndTime == 0 {
		now := time.Now().Unix()
		p.EndTime = now
		p.StartTime = now - 30*86400 //查30天的数据
	}
	data, count, err := pc.ListDaySystemUser(p.ListParams, p.ListDayParams, p.OperateType, p.SysUid)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}

	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取系统帐号流水月报表
// @Description 获取系统帐号流水月报表
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   start_time   body   int     false      "开始时间(时间单位为天,时间戳)"
// @Param   end_time     body   int     false      "结束时间(时间单位为天,时间戳)"
// @Param   operate_type body   int     false      "1-手动增加流入,2-购买流出,3-绑定手机赠送流出,4-活动赠送流出,5-手动赠送流出(后台增加玩家的钻石),6-手动回收流入(后台减少玩家的钻石), 7-玩家注册赠送流出,8-购买赠送流出"
// @Param   sys_uid      body   int     false      "系统帐号uid"
// @Success 0 {string} 列表
// @router /month-system/list-month-system [post]
func (b *StatController) ListMonthSystemUser() {
	type Params struct {
		ListParams
		ListDayParams
		OperateType int64 `json:"operate_type"`
		SysUid      int64 `json:"sys_uid"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if p.StartTime == 0 && p.EndTime == 0 {
		now := time.Now().Unix()
		p.EndTime = now
		p.StartTime = now - 12*30*86400 //查12个月的数据
	}

	data, count, err := pc.ListMonthSystemUser(p.ListParams, p.ListDayParams, p.OperateType, p.SysUid)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}

	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取系统帐号流水详细列表(暂时不能跨月查询)
// @Description 获取系统帐号流水详细列表(暂时不能跨月查询)
// @Param   page_size    body   int     true       "每页显示数量"
// @Param   page_index   body   int     true       "第几页"
// @Param   start_time   body   int     false      "开始时间(时间单位为天,时间戳)"
// @Param   end_time     body   int     false      "结束时间(时间单位为天,时间戳)"
// @Param   operate_type body   int     false      "1-手动增加流入,2-购买流出,3-绑定手机赠送流出,4-活动赠送流出,5-手动赠送流出(后台增加玩家的钻石),6-手动回收流入(后台减少玩家的钻石), 7-玩家注册赠送流出,8-购买赠送流出"
// @Param   sys_uid      body   int     false      "系统帐号uid"
// @Param   operate_uid  body   int     false      "操作者uid(PC后台的),-1表示系统操作的"
// @Success 0 {string} 列表
// @router /system-user-detail/list-system-user-detail [post]
func (b *StatController) ListSystemUserDetail() {
	type Params struct {
		ListParams
		ListDayParams
		OperateType int64 `json:"operate_type"`
		SysUid      int64 `json:"sys_uid"`
		OperateUid  int64 `json:"operate_uid"`
	}
	var p Params
	if !b.DecodeParams(&p) {
		return
	}
	if !b.ValidParams(&p) {
		return
	}
	if p.StartTime == 0 && p.EndTime == 0 { //如果没传时间就查询今天的数据
		p.StartTime, p.EndTime = StartEndTimeByTimestamp(time.Now().Unix())
	} else {
		if !IsSameMonth(p.StartTime, p.EndTime) {
			b.ResponseFail("暂时不能做跨月查询")
			return
		}
	}
	data, count, err := pc.ListSystemUserDetail(p.ListParams, p.ListDayParams, p.OperateType, p.SysUid, p.OperateUid)
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}

	b.Res.Data = data
	b.Res.Count = count
	b.ResponseSuccess()
}

// @Title 获取系统帐号钻石消耗情况
// @Description 获取系统帐号钻石消耗情况
// @Success 0 {string} 列表
// @router /system-user/list-system-user [post]
func (b *StatController) ListSystemUser() {
	data, err := pc.ListSystemUser()
	if err != nil {
		LogPc.Error(b.DatabaseError(err.Error()))
		return
	}
	b.Res.Data = data
	b.ResponseSuccess()
}
